/**
02_rollup 业务打包是指利用 Rollup 工具对特定业务逻辑和模块进行打包，以便在生产环境中高效地部署和运行。
  1. 业务打包的目的
  - 提高加载速度：通过将多个模块打包成一个文件，减少 HTTP 请求，提高页面加载速度。
  - 减小文件体积：通过树摇优化和代码压缩，减小最终生成的文件体积。
  - 模块化管理：将业务逻辑拆分成多个模块，方便管理和维护。

  2. Rollup 的基本概念
  - 入口文件：指定应用程序的入口点，通常是一个 JavaScript 文件。
  - 输出配置：定义打包后文件的名称、格式和路径。
  - 插件：通过插件扩展 Rollup 的功能，支持各种文件类型的处理。

  3. 配置示例
  以下是一个基本的 Rollup 配置示例：

  ```javascript
  // rollup.config.js
  import resolve from '@rollup/plugin-node-resolve';
  import commonjs from '@rollup/plugin-commonjs';
  import { terser } from 'rollup-plugin-terser';

  export default {
    input: 'src/index.js', // 入口文件
    output: {
      file: 'dist/bundle.js', // 输出文件
      format: 'iife', // 输出格式
      name: 'MyLibrary', // 库的名称
    },
    plugins: [
      resolve(), // 解析 node_modules 中的模块
      commonjs(), // 转换 CommonJS 模块
      terser(), // 代码压缩
    ],
  };
  ```

  4. 打包流程
  1. 安装 Rollup：使用 npm 安装 Rollup 及相关插件。
    ```bash
    npm install --save-dev rollup @rollup/plugin-node-resolve @rollup/plugin-commonjs rollup-plugin-terser
    ```
    
  2. 创建配置文件：根据项目需求创建 `rollup.config.js` 文件。

  3. 执行打包命令：通过命令行运行 Rollup 进行打包。
    ```bash
    npx rollup -c
    ```

  5. 优化建议
  - 合理拆分模块：将业务逻辑合理拆分成多个模块，避免单个文件过大。
  - 使用插件：根据业务需求选择合适的插件，提升打包效率和代码质量。
  - 监控打包结果：定期检查打包后的文件体积和性能，确保优化效果。

  6. 适用场景
  02_rollup 业务打包适用于各类 JavaScript 应用程序，尤其是需要高性能和低延迟的前端项目。它非常适合构建库、组件和小型应用。

  希望以上总结能够帮助你更好地理解 02_rollup 业务打包的相关内容！如果有其他问题，欢迎随时询问。
 */
// 默认lodash没有被打包是因为它使用commonjs, rollup默认情况下只会处理es module
const commonjs = require("@rollup/plugin-commonjs");
const nodeResolve = require("@rollup/plugin-node-resolve");
// 使用代码转换和压缩
const { babel } = require("@rollup/plugin-babel");
const terser = require("@rollup/plugin-terser");
const postcss = require("rollup-plugin-postcss");
const vue = require("rollup-plugin-vue");
const replace = require("@rollup/plugin-replace");
const serve = require("rollup-plugin-serve");
const livereload = require("rollup-plugin-livereload");

const isProduction = process.env.NODE_ENV === "production";
const plugins = [
  commonjs(),
  nodeResolve(),
  babel({
    babelHelpers: "bundled", // 使用rollup内置的babel
    exclude: /node_modules/, // 排除node_modules
  }),
  postcss(),
  vue(),
  replace({
    "process.env.NODE_ENV": JSON.stringify(process.env.NODE_ENV), // 替换环境变量
    preventAssignment: true, // 防止替换赋值
  }),
];

if (isProduction) {
  plugins.push(terser());
} else {
  const extraPlugins = [
    serve({
      port: 8000,
      open: true,
      contentBase: ".",
    }),
    livereload(),
  ];
  plugins.push(...extraPlugins); // 合并数组
}

module.exports = {
  input: "./src/index.js",
  output: {
    format: "umd", // 生成umd格式
    name: "myUtils",
    file: "./build/bundle.umd.js",
    globals: {
      lodash: "_",
    },
  },
  plugins: plugins,
};
